A biblioteca CD é uma biblioteca gráfica (GL) básica. Em um paradigma GL são utilizadas primitivas, que possuem atributos, para desenhar sobre um canvas. Todas as funções da biblioteca refletem este paradigma.
O canvas é o elemento básico. Ele pode ter diversas formas: um papel, um monitor de vídeo, um formato de arquivo gráfico. A superfície de desenho virtual na qual o canvas existe é representada por um driver. Apenas ele sabe como desenhar sobre a sua superfície. O usuário não utiliza o driver diretamente, usando apenas o canvas.
Para simplificar a biblioteca, empregou-se o conceito de um canvas ativo, sobre o qual todas as primitivas são desenhadas. Isso também permite o uso de um mecanismo de expansão através de tabelas de funções. Infelizmente, isso é bastante perigoso, pois se uma função for chamada sem um canvas ativo ocorrerá uma invasão de memória. Porém, o mecanismo permite que a biblioteca seja expandida com novos drivers sem limite.
Os atributos também são separados das primitivas. Eles residem no canvas através de um mecanismo de estado. Se o estado do atributo no canvas for modificado, todas as primitivas desenhadas nesse canvas que dependem do atributo serão desenhadas de um modo diferente.
O conjunto de primitivas é bastante pequeno, porém completo o bastante para compor uma GL. Algumas primitivas dependem do sistema por razões de desempenho. Alguns drivers (baseados em janelas e dispositivos) empregam funções do sistema para implementar as primitivas de maneira ótima. Às vezes, isso implica em um comportamento errôneo por parte de algumas funções. Além disso, algumas primitivas não fazem sentido em alguns drivers, como imagens de servidor em drivers baseados em arquivos.
O conjunto de funções disponíveis procura ser tal que possa ser implemnetado na grande maioria dos drivers. Mas alguns drivers possuem recursos sofisticados que embora não possam ser implementados em outros drivers podem ser disponibilizados para esse driver apenas através do arquivo de inclusão do próprio driver, sendo que o nome da função deve inclui o prefixo do driver, ex: cdDXFSetLayer. Se não houver um canvas do driver em questão ativo, a função deve apenas retornar sem fazer nada. Estamos estudando um mecanismo para flexibilizar extensões à biblioteca.
Todas as funções de CD são declaradas no arquivo de inclusão cd.h; as funções de Coordenadas de Mundo são declaradas no arquivo wd.h e cada driver possui um arquivo de inclusão correspondente que deve ser incluído para criar um canvas. É importante incluir cada arquivo de driver após a inclusão do arquivo cd.h.
A biblioteca não impõe qualquer exigência específica sobre o compilador. Assim, as opções de compilação padrão deveriam ser suficientes para que tudo funcione. A biblioteca sempre tem um módulo de ligação estático, porém em algumas plataformas também há uma biblioteca de ligação dinâmica disponível.
Em UNIX, bibliotecas dinâmicas são automaticamente utilizadas pelo linker. Para forçar uma linquedição estática, sugerimos incluir os arquivos ".a" da biblioteca diretamente na lista de arquivos para linquedição no makefile.
Em Windows, deve-se passar a usar todas as bibliotecas também como DLL para evitar problemas de linquedição. O parâmetro mais importante neste caso fica no Visual C++ 5 em Project/Settings/C++/Code Generation/Use Run Time Library que deve ser Multithreaded DLL ou Debug Multithreaded DLL. Isso também fará com que seu programa dependa do arquivo MSVCRT.DLL, em geral disponível nas instalações do Windows 95/98/NT4.
Em ambos os casos o programa só será executado se os arquivos das bibliotecas também estiverem presentes em algum lugar no PATH. Assim ao distribuir sua aplicação tenha isso em mente.
CDDIR - Esta variável de ambiente é utilizada por alguns drivers para localizar arquivos de dados úteis, como arquivos de definição de fontes. Contém o path do diretório, sem a barra final.
CD_QUIET - No UNIX, se estiver definida, passa a não mostrar as informações de versão da biblioteca no sdtout.
A melhor forma de implementar um novo criver é se basear em um existente. Por isso, disponibilizamos o código fonte do driver mais simples da biblioteca o CD_METAFILE. O código está bem comentado de maneira a facilitar esse processo e esclarecer algumas dúvidas. Veja em CDMF.H e CDMF.C
Assim como, deve-se ler o tópico de "Arquitetura Interna" deste manual.
Para preencher estruturas de dados das primitivas da biblioteca durante uma chamada a cdPlay, você deve implementar um driver e ativá-lo antes de chamar cdPlay. Dentro das primitivas do driver, você pode preencher sua estrutura de dados com as informações interpretadas pela função cdPlay.
Para fins de feedback, você pode testar o ponteiro dado como retorno por cdCreateCanvas apenas ao ativar os drivers que têm acesso a arquivos como PS, CGM, etc. Para outros erros, é necessário realizar testes apenas para fins de depuração. Nunca ative um canvas nulo ou chame uma função da biblioteca CD sem um canvas ativo (com exceção de cdCreateCanvas, cdKillCanvas, cdActivate, cdActiveCanvas, cdEncodeColor e cdDecodeColor).
Para melhor verificação de parâmetros também disponibilizamos a biblioteca com informação de depuração, já que todas as funções possuem diretivas ASSERT.
A biblioteca possui algumas estruturas e enumerações que podem entrar em conflito com o código da aplicação. Estruturas e typedefs: cdContext e cdCanvas.
Para as enumerações, consulte o arquivo de inclusão cd.h.
O elemento IupCanvas da biblioteca IUP pode ser usado como superficie de visualização para um canvas CD. Existem dois momentos em que uma aplicação que utilize ambas as bibliotecas deve se preocupar. A primeira é durante a criação do canvas CD e a segunda é durante a mudança de tamanho do canvas IUP.
Criação do Canvas CD
A criação do canvas CD deve ser feita sempre depois do elemento IupCanvas ter sido mapeado no controle nativo do sistema. Isso acontece quando a aplicação chama a IupShow ou quando chama explicitamente a IupMap.
Como uma chamada a IupShow gera uma chamada a callback de ACTION do canvas IUP, ocorre uma situação peculiar. O canvas CD não pode ser criado antes da IupShow, mas se for criado depois não pode-se desenhar na primeira vez que a callback de redesenho do canvas IUP é chamada.
Existem diversas maneiras de abordar o problema:
- Pode-se forçar o mapeamento antes da IupShow chamando-se a IupMap, antes de criar o canvas CD.
- Pode-se criar o canvas CD depois da IupShow, mas associando a callback de redesenho do canvas também depois da IupShow e forçando-se uma chamada a mesma.
- Pode-se criar o canvas CD durante a callback de redesenho ou durante a callback de mudança de tamanho, que também é chamada durante um IupShow.
- Pode-se criar o canvas durante a callback de MAP_CB, que é chamada após o elemento IupCanvas ter sido mapeado no controle nativo.
Qualquer uma das soluções acima funciona corretamente. A solução mais elegante parece ser a que utiliza a callback MAP_CB.
A criação do canvas CD também requer que alguns parâmetros sejam passados para o driver Native Window. Esses parâmetros são obtidos do canvas IUP através do atributo CONID. A criação do canvas fica:
myCdCanvas = cdCreateCanvas(CD_NATIVEWINDOW, IupGetAttribute(myIupCanvas, "CONID")); IupSetAttribute(myIupCanvas, "_CD_CANVAS", myCdCanvas);O driver CD_IUP pode ainda ser utilizado, mas deve-se linqueditar com a biblioteca "cdiup".
Redimensionamento do Canvas IUP
Se a aplicação sempre ativa o canvas antes de desenhar, mesmo que ele já esteja ativo, então não precisa se preocupar com essa situação. Caso contrário, deve-se ativar o canvas CD na callback de Resize do canvas IUP.
Existem outras bibliotecas gráficas, com alguma portabilidade entre sistemas operacionais, disponíveis na Internet. Dentre elas destacam-se:
- VOGL - A very ordinary GL Like Library. Muito semelhante a biblioteca CD, mas não é mais atualizada desde 1995. Possui vários drivers, contém rotinas de 2D e 3D, assim como iluminação. - http://www.cs.kuleuven.ac.be/~philippe/vogl/.
- SRGP - Baseada no livro do Foley, não encontrei o código disponível. Voltada apenas para display. - http://www.micg.et.fh-stralsund.de/~pohlers/srgp.html.
- GGI - Biblioteca gráfica 2D voltada apenas para display. - http://www.ggi-project.org/.
- GKS - Biblioteca gráfica 2D e 3D bastante completa, mas possui recursos limitados para imagens. É um padrão ISO, e suas implementações em geral são comerciais. O Tecgraf possui uma implementação que caiu em desuso, sendo substituída pela biblioteca CD. - http://www.bsi.org.uk/sc24/.
- Mesa - biblioteca gráfica 3D com suporte ao padrão OpenGL. Implementada em C. Voltada apenas para display e suas funções de atributos são voltadas para recursos de iluminação e shading. - http://www.mesa3d.org/.
- OpenGL - biblioteca gráfica 3D com algum suporte 2D. Voltada apenas para display. Um canvas CD de janela pode coexistir com um canvas OpenGL ao mesmo tempo. Obs: quando usar Double Buffer não esquecer de fazer o swap buffer antes de desenhar com a biblioteca CD - http://www.opengl.org.
- GD - biblioteca para desenhar em imagens exclusivamente, salva arquivos PNG. Implementada em C. - http://www.boutell.com/gd/.
- GDK - Utilizada pelo toolkit GTK de interface com o usuário. Implementada em C. Voltada apenas para display e muitas funções são para o gerenciamento de janelas, teclado e mouse. Implementada em C. - http://www.gtk.org/.
- Existem ainda muitas bibliotecas de interface com o usuário que contém funções de desenho. A grande maioria é implementada em C++, e são voltadas apenas para display.
Podemos observar que o conceito de superfícies de desenho abstratas foi pouco utilizado dentre as mesmas. Assim, acabam por serem voltadas apenas para display, o que também faz com que sejam agregadas rotinas de interface com o usuário. Outras acrescentam rotinas de desenho em 3 dimensões, juntamente com rotinas de iluminação de cenas. Tudo isso, aumenta desnecessariamente a complexidade das mesmas, e não as torna mais completas como bibliotecas gráficas 2D.
Quanto ao desempenho, a biblioteca CD é tão boa quanto as outras e em alguns casos possui desempenho superior.
Assim, a biblioteca CD oferece recursos e qualidades únicos como uma biblioteca gráfica 2D portátil.